package com.xkh.common.controller;

import com.xkh.common.common.constant.Result;
import com.xkh.common.model.dto.NearbyPositionDTO;
import com.xkh.common.model.dto.PositionDTO;
import com.xkh.common.model.vo.UserPositionVO;
import com.xkh.common.service.INearbyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Point;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 *  GeoHash将二维的经纬度转换成字符串
 *  GeoHash编码中，字符串相似的表示距离相近（特殊情况后文阐述），这样可以利用字符串的前缀匹配来查询附近的POI信息
 *  边界问题
 *  查询时，除了使用定位点的GeoHash编码进行匹配外，还使用周围8个区域的GeoHash编码,再过滤距离小于半径的位置
 */
@RestController
@RequestMapping("util/nearby")
@Api(tags = "附近的人模块")
public class NearbyController {

    @Autowired
    private INearbyService nearbyService;

    @ApiOperation("更新用户的地理位置")
    @PostMapping("/updatePosition")
    public Result<String> updatePosition(@Validated PositionDTO positionDTO) {
        boolean result = nearbyService.updatePosition(positionDTO);
        if (result) {
            return Result.succeed();
        }
        return Result.failure();
    }

    @ApiOperation("查询用户的地理位置")
    @GetMapping("/getPosition/{userId}")
    public Result<List<Point>> getPosition(@PathVariable Long userId) {
        List<Point> points = nearbyService.getPosition(userId);
        return Result.succeedData(points);
    }

    @ApiOperation("根据当前位置查询指定范围内的用户")
    @GetMapping("/getNearbyPosition")
    public Result<List<UserPositionVO>> getNearbyPosition(NearbyPositionDTO nearbyPositionDTO){
        List<UserPositionVO> list = nearbyService.getNearbyPosition(nearbyPositionDTO);
        return Result.succeedData(list);
    }
}
